package com.aaa.reflect;

import java.lang.annotation.Annotation;
import java.lang.reflect.Field;
import java.lang.reflect.Method;

public class Test {
    public static void main(String[] args) throws Exception {
//        Person person1=new Person(100,"张三");
//        System.out.println(person1.toString());
//        Person person2=new Student(100,"张三",290);
//        System.out.println(person2.toString());


//        //1.通过类名（全路径名）获取class对象 com.aaa.reflect.Person
//        try {
////            Class<?>它是个通配泛型，?可以代表任何类型，主要用于声明时的限制情况
//            Class<?> clazz1 = Class.forName("com.aaa.reflect.Person");
//            System.out.println(clazz1);
//        } catch (ClassNotFoundException e) {
//            e.printStackTrace();
//        }
//        //2,通过.Class方式获取Class对象
//        Class<Person> clazz2 = Person.class;
//        System.out.println(clazz2);
//        //3.通过对象的getClass方法获取
//        Person person=new Person();
        //泛型上限  小于等于person
//        Class<? extends Person> clazz3 = person.getClass();
//        System.out.println(clazz3);

//
//        Class<Person> clazz= Person.class;
//        //getName()获得类的完整路径名字
//
//        String clazzName=clazz.getName();
//        //getpackage()获得类的包
//        String packagename= clazz.getPackage().getName();
//        //getSimpleName 获得类的名字
//        String simpleName = clazz.getSimpleName();
//        System.out.println(clazzName);
//        System.out.println(packagename);
//        System.out.println(simpleName);


        //newInstance()创建一个实例对象
//        Class<Person> clazz= Person.class;
//        try {
//            //调用的是无参构造器
//            Person person= clazz.newInstance();
//            System.out.println(person.toString());
//        } catch (InstantiationException e) {
//            e.printStackTrace();
//        } catch (IllegalAccessException e) {
//            e.printStackTrace();
//        }

        //泛型下线 大于等于Person   getSuperclsss()获得当前类继承的父类
//        Class<Person> clazz= Person.class;
//        Class<? super Person> superclass = clazz.getSuperclass();
//        System.out.println(superclass);



        //getAnnotation() 获取类上的注解
//        Class<Person> clazz= Person.class;
//        Annotation[] annotations= clazz.getAnnotations();
//        System.out.println(annotations.length);
//        for (Annotation annotation : annotations) {
//            System.out.println(annotation.toString());
//        }



//        获取接口
        //getInterfaces()  获得当前类实现的类或接口
//        Class<Person> clazz= Person.class;
//        Class<?>[] interfaces= clazz.getInterfaces();
//        System.out.println(interfaces.length);





        //Field
//
//        Class<Person> clazz= Person.class;
//        try {
//            //获取某个公有的属性对象
//            Field field= clazz.getField("name");
////            获得某个私有属性对象
//            Field fieldId= clazz.getDeclaredField("id");
////获得所有属性对象
//            Field fieldname= clazz.getDeclaredField("name");
//
//            System.out.println(field.getName());
//
//            System.out.println(fieldId.getName());
//            System.out.println(fieldname.getName());
//        } catch (NoSuchFieldException e) {
//            e.printStackTrace();
//        }


//        Class<Person> clazz= Person.class;
//        Field[] fields = clazz.getDeclaredFields();
//        for (Field field : fields) {
//            System.out.println(field);
//        }


//        Class<Person> clazz= Person.class;
//        Person person=new Person(1,"admin");
//        Person person1= clazz.newInstance();
//        System.out.println(person.equals(person1));


//        Class<Person> clazz= Person.class;
//        Field name1= clazz.getField("name");
//        Field name2= clazz.getField("name");
//        boolean equals = name1.equals(name2);
//        System.out.println(equals);


//        Class<Person> clazz= Person.class;
//        Person person=new Person(1,"admin");
//        Field name1= clazz.getDeclaredField("name");
//        name1.setAccessible(true);
//        //传入一个对象，通过属性对象获取属性值
//        Object o=name1.get(person);
//        System.out.println(o);
//        System.out.println(person);
//        System.out.println("===========");
//        //设置新值
//        name1.set(person,"xxxx");
//        System.out.println(person);






        System.out.println("------------------------------------");
        Class<Person> clazz= Person.class;

        Method method = clazz.getMethod("introduce");
        System.out.println(method);

    }









}
